package demo.practice.bit;

import java.util.Stack;

public class Ms0504 {

    //1、 一个略大的数     首先能看出是  右边的1和左边的0交换
    // 0111  -->  1011  可以看出是  从右到左第一个0 和它右边第一个1交换
    // 100010   --> 100100
    //  1000011 --> 1000101


    //2、一个略小的数      首先可以看出来是   右边的0和左边的1交换才能变大
    //100   --> 010     可以看出是   从右到左的第一个1和它右边第一个0交换
     //100010   --> 100001
        //1000011 --> 0111000


    public static void main(String[] args) {

        System.out.println(Integer.toBinaryString(67));
        System.out.println(Integer.toBinaryString(56));
        Ms0504 ms0504= new Ms0504();
        ms0504.findClosedNumbers(67);

    }

    public int[] findClosedNumbers(int num) {
        int num1 = num, num2 = num;
        int[] res= new int[]{-1,-1};

        Stack<Integer> stack1=new Stack<>();
        boolean b1=false;
        for (int i=0;i<31&&num1>=0;i++){
            int bit= num1&1;
            if(bit==0&& stack1.size()>0&& stack1.peek()==1 && !b1){
                stack1.pop();
                stack1.add(0);
                stack1.add(1);
                b1=true;
            }else
                stack1.add(bit);
            if(num1==0)
                break;
            num1>>=1;
        }

        if(b1){
            res[0]=0;
            while (stack1.size()>0)
            res[0]=(res[0]<<1)^stack1.pop();
        }

        stack1.clear();
        b1=false;
        for (int i=0;i<31&&num1>=0;i++){
            int bit= num2&1;
            if(bit==1&& stack1.size()>0&& stack1.peek()==0 && !b1){
                stack1.pop();
                stack1.add(1);
                stack1.add(0);
                b1=true;
            }else
                stack1.add(bit);
            if(num2==0)
                break;
            num2>>=1;
        }

        if(b1){
            res[1]=0;
            while (stack1.size()>0)
                res[1]=(res[1]<<1)^stack1.pop();
        }
        return res;
    }
}
